What Every Programer Should Know About Object-Oriented Design